<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/1/7
 * Time: 10:13
 *
 * 基于 Auth 的权限 验证
 *
 */
namespace Auth\Controller;

use Think\Controller;

class AuthController extends Controller{

    public function __construct()
    {
        header('Content-type:text/html;charset=utf8');
        parent::__construct();

        //检查当前用户是否登录
        if(empty($_SESSION['AUTH_USER']['id'])){
            $this->error('请登录系统',U('Public/login'));
        }

        //检查权限
        if(!$this->checkAuth($_SESSION['AUTH_USER']['id'])){
            $this->error('没有权限');
        }

    }


    /**
     * 权限检查
     * @param $uid int 学生id;
     * @return boolean;
     */
    public function checkAuth($uid){
        static $_authList =  array();
        //超级管理员，有所有的权限
        if((int)$uid === C('ROOT_ID')){
            return true;
        }
        //获取权限
        $ids = $this->getGroup($uid);
        $this->getAuthList($ids);
        //开始 验证
        $check = $this->check($uid);
        if(false === $check){

        }else if(true === $check){
            return true;
        }

    }

    /**
     * 获取 用户所在组
     * @param $uid
     *
     * @return string $ids : id的集合
     */
    final protected function getGroup($uid){
        $model = D('AuthGroup');

        //强制：使用每个用户单独对应一个用户组
        $groups = $model->getOne(array('uid'=>$uid),'id,title,roles');

        //too do 组合所有id的集合;
        $ids = $groups['roles'];

        return $ids;
    }

    /**
     * 获取 权限列表 -- 采用 OneThink的 URL 机制
     * @param $ids string : 规则id的集合
     *
     * @return array() 规则集合;
     */
    final protected function getAuthList($ids){
        if(!empty(session('_AUTH_LIST'))){
            return session('_AUTH_LIST');
        }
        $model = D('AuthRole');
        $map = array(
            'id'=>array('in',$ids),
        );

        //获取权限列表
        $authlist = $model->getAll($map,'id,name,condition');
        foreach($authlist as $k=>$v){
            $auth_list[$k] = $v['name'];
        }
        session('_AUTH_LIST',$auth_list);
        return ($auth_list);
    }


    /**
     * 验证 用户权限
     * @param int $uid :用户的id
     * @return bool
     */
    final public function check($uid){

        //当前 访问地址
        $now_visit = MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME;

        //初步，无参数判断
        if(in_array($now_visit,session('_AUTH_LIST'))){
            return true;
        }
        //too do :: 详细的 验证

        return false;

    }
}